今天我們挑選一個由Google在2019年發表的CNN模型架構EfficientNet為大家演示,此過程中使用到Functional的模型建構方式。
from tensorflow.keras.applications import EfficientNetB0
如果你只想使用網路的架構,那只要這樣就行了。
model = EfficientNetB0(include_top=True, weights=None, input_shape=(32,32,3), pooling='avg', classes=10, classifier_activation='softmax')
要做遷移學習,我們載入模型架構,然後指定用imagenet訓練過後的權重初始化,由於imagenet有1000個類別,我們要變更最後二元分類器的數量,先使用include_top=False取消模型最後的全連接層,之後再手動接上感知層,作為輸出的分類器,由於不能參考imagenet的權重,此層權重將採用隨機初始化。
from tensorflow.keras.layers import Dense
from tensorflow.keras.models import Model
model = EfficientNetB0(include_top=False, weights='imagenet', input_shape=(32,32,3), pooling='avg')
x = model.output
output = Dense(units=10, activation='softmax')(x)
model = Model(inputs=model.input, outputs=output)
前述只使用架構的方法,會幫我們在模型的最後感知層與全局平均池化層中間加上Dropout層,在遷移學習這裡我們沒有添加,有需要的可以自行加上。
由於這類預訓練權重都是在解析度較高的圖片訓練而成,模型前幾層將圖片的解析度降了不少,但是cifar10的解析度不高,過了模型前幾層後,剩下2X2甚至1X1的解析度,因此很難學習到甚麼東西,所以我們這裡就不做成果展示了。